//
//  DMFirebaseManager.h
//  DualMediationSDK
//
//  Created by YeJary on 2025/8/25.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <UserNotifications/UserNotifications.h>
#import "IMFCMModels.h"
#import "IMFCMPushModels.h"

NS_ASSUME_NONNULL_BEGIN

// Forward declarations
@class UIViewController;
@class IMNetworkTask;

// FCM回调类型定义
typedef void (^IMFCMSuccessBlock)(IMFCMResponse *response);
typedef void (^IMFCMFailureBlock)(NSError *error);

/**
 * Firebase统一管理器
 * 集成Firebase Core和FCM功能
 */
@interface DMFirebaseManager : NSObject

+ (instancetype)shareFirebaseManager;

#pragma mark - Firebase Core
- (void)initializeFirebaseIfNeeded;
- (void)firebaseRegisterForRemoteNotificationsApplication:(UIApplication *)application;

#pragma mark - FCM Token Upload
/**
 * 上传FCM设备令牌接口
 * @param appId 应用唯一ID
 * @param uuid 用户唯一ID
 * @param fcmToken 设备令牌
 * @param success 成功回调
 * @param failure 失败回调
 * @return 网络任务对象
 */
- (IMNetworkTask *)uploadFCMTokenWithAppId:(NSString *)appId
                                      uuid:(NSString *)uuid
                                  fcmToken:(NSString *)fcmToken
                                   success:(IMFCMSuccessBlock _Nullable)success
                                   failure:(IMFCMFailureBlock _Nullable)failure;

/**
 * 使用FCM请求模型上传设备令牌
 * @param request FCM请求模型
 * @param success 成功回调
 * @param failure 失败回调
 * @return 网络任务对象
 */
- (IMNetworkTask *)uploadFCMTokenWithRequest:(IMFCMRequest *)request
                                     success:(IMFCMSuccessBlock _Nullable)success
                                     failure:(IMFCMFailureBlock _Nullable)failure;

#pragma mark - FCM Push Service
/**
 * 检查FCM是否已初始化
 * @return YES表示已初始化，NO表示未初始化
 */
- (BOOL)isFCMInitialized;

/**
 * 初始化Firebase消息推送（基础版本）
 * @param completion 完成回调
 */
- (void)initializeFirebaseMessagingWithCompletion:(nullable IMFCMPushCompletionBlock)completion;

/**
 * 初始化Firebase消息推送（带目标页面）
 * @param targetViewControllerClass 点击通知时打开的页面类
 * @param completion 完成回调
 */
- (void)initializeFirebaseMessagingWithTargetViewController:(Class)targetViewControllerClass 
                                                 completion:(nullable IMFCMPushCompletionBlock)completion;

/**
 * 初始化Firebase消息推送（完整配置）
 * @param config 推送配置
 * @param completion 完成回调
 */
- (void)initializeFirebaseMessagingWithConfig:(IMFCMPushConfig *)config 
                                   completion:(nullable IMFCMPushCompletionBlock)completion;

/**
 * 获取当前FCM令牌
 * @return FCM令牌，未初始化返回nil
 */
- (nullable NSString *)getCurrentFCMToken;

/**
 * 异步获取FCM令牌
 * @param completion 完成回调
 */
- (void)getFCMTokenWithCompletion:(IMFCMPushCompletionBlock)completion;

/**
 * 请求通知权限
 * @param completion 完成回调
 */
- (void)requestNotificationPermissionWithCompletion:(void(^)(BOOL granted, NSError * _Nullable error))completion;

/**
 * 检查通知权限状态
 * @param completion 完成回调
 */
- (void)checkNotificationPermissionWithCompletion:(void(^)(UNAuthorizationStatus status))completion;

/**
 * 设置通知接收回调
 * @param callback 通知接收回调
 */
- (void)setNotificationReceivedCallback:(nullable IMFCMNotificationReceivedBlock)callback;

/**
 * 设置令牌刷新回调
 * @param callback 令牌刷新回调
 */
- (void)setTokenRefreshCallback:(nullable IMFCMTokenRefreshBlock)callback;

/**
 * 处理通知点击（在AppDelegate中调用）
 * @param userInfo 通知用户信息
 */
- (void)handleNotificationTap:(NSDictionary *)userInfo;

/**
 * 处理通知点击（带视图控制器）
 * @param userInfo 通知用户信息
 * @param viewController 目标视图控制器
 */
- (void)handleNotificationTap:(NSDictionary *)userInfo viewController:(UIViewController *)viewController;

/**
 * 订阅主题
 * @param topic 主题名称
 * @param completion 完成回调
 */
- (void)subscribeToTopic:(NSString *)topic completion:(nullable void(^)(NSError * _Nullable error))completion;

/**
 * 取消订阅主题
 * @param topic 主题名称
 * @param completion 完成回调
 */
- (void)unsubscribeFromTopic:(NSString *)topic completion:(nullable void(^)(NSError * _Nullable error))completion;

/**
 * 设置用户属性（用于个性化推送）
 * @param value 属性值
 * @param key 属性键
 */
- (void)setUserProperty:(NSString *)value forKey:(NSString *)key;

/**
 * 启用/禁用自动初始化
 * @param enabled 是否启用
 */
- (void)setAutoInitEnabled:(BOOL)enabled;

/**
 * 检查是否为FCM通知
 * @param userInfo 通知用户信息
 * @return YES表示是FCM通知，NO表示不是
 */
- (BOOL)isFCMNotification:(NSDictionary *)userInfo;

#pragma mark - Firebase Analytics
/**
 * 记录Firebase Analytics事件
 * @param eventName 事件名称
 * @param parameters 事件参数（可选）
 */
- (void)logEvent:(NSString *)eventName parameters:(nullable NSDictionary<NSString *, id> *)parameters;

/**
 * 记录Firebase Analytics事件（带完成回调）
 * @param eventName 事件名称
 * @param parameters 事件参数（可选）
 * @param completion 完成回调
 */
- (void)logEvent:(NSString *)eventName 
      parameters:(nullable NSDictionary<NSString *, id> *)parameters 
      completion:(nullable void(^)(NSError * _Nullable error))completion;

/**
 * 设置用户属性（Firebase Analytics）
 * @param value 属性值
 * @param name 属性名称
 */
- (void)setUserProperty:(NSString *)value forName:(NSString *)name;

/**
 * 设置用户ID（Firebase Analytics）
 * @param userId 用户ID
 */
- (void)setUserId:(NSString *)userId;

@end

NS_ASSUME_NONNULL_END
